﻿#define _CRT_SECURE_NO_WARNINGS

//#include<iostream>
//#include<unordered_set>
//#include<unordered_map>
//#include<set>
//#include<vector>
//
//using namespace std;
//void Test_unset()
//{
//	//unordered_set的和set差不多，只不过set会根据大小排序，unordered底层是哈希通用于统计个数
//	unordered_set<int> unset;
//	unset.insert(4);
//	unset.insert(1);
//	unset.insert(6);
//	unset.insert(231);
//	unset.insert(24);
//	unset.insert(13);
//	unset.insert(2);
//	unordered_set<int>::iterator it1 = unset.begin();
//	
//	while (it1 != unset.end())
//	{
//		cout << *it1 << ' ';
//		++it1;
//	}
//	cout << endl;
//}
//
//void Test_unmap()
//{
//	//统计次数的作用，并没排序作用，但是和map使用方式一样
//	unordered_map<string, string> unmap;
//	unmap.insert({ "name","名字" });
//	unmap.insert({ "string","字符串" });
//	unmap.insert({ "left","向左" });
//	unmap.insert({ "right","向右" });
//	unmap.insert({ "fruit","水果" });
//	unmap.insert({ "word","单词" });
//
//	unordered_map<string, string>::iterator it1 = unmap.begin();
//	while (it1 != unmap.end())
//	{
//		cout << it1->first << ':' << it1->second << endl;
//		++it1;
//	}
//	cout << endl;
//}
//
//int test_set2()
//{
//	const size_t N = 100000;
//	unordered_set<int> us;
//	set<int> s;
//	vector<int> v;
//	v.reserve(N);
//	srand(time(0));
//	for (size_t i = 0; i < N; ++i)
//	{
//		//v.push_back(rand()); // N⽐较⼤时，重复值⽐较多
//		v.push_back(rand() + i); // 重复值相对少
//		//v.push_back(i); // 没有重复，有序
//	}
//
//	size_t begin1 = clock();
//	for (auto e : v)
//	{
//		s.insert(e);
//	}
//	size_t end1 = clock();
//	cout << "set insert:" << end1 - begin1 << endl;
//	size_t begin2 = clock();
//	us.reserve(N);
//	for (auto e : v)
//	{
//		us.insert(e);
//	}
//	size_t end2 = clock();
//	cout << "unordered_set insert:" << end2 - begin2 << endl;
//	int m1 = 0;
//	size_t begin3 = clock();
//	for (auto e : v)
//	{
//		auto ret = s.find(e);
//		if (ret != s.end())
//		{
//			++m1;
//		}
//	}
//
//	size_t end3 = clock();
//	cout << "set find:" << end3 - begin3 << "->" << m1 << endl;
//	int m2 = 0;
//	size_t begin4 = clock();
//	for (auto e : v)
//	{
//		auto ret = us.find(e);
//		if (ret != us.end())
//		{
//			++m2;
//		}
//	}
//
//	size_t end4 = clock();
//	cout << "unorered_set find:" << end4 - begin4 << "->" << m2 << endl;
//	cout << "插入数据个数：" << s.size() << endl;
//	cout << "插入数据个数：" << us.size() << endl << endl;
//	size_t begin5 = clock();
//	for (auto e : v)
//	{
//		s.erase(e);
//	}
//
//	size_t end5 = clock();
//	cout << "set erase:" << end5 - begin5 << endl;
//	size_t begin6 = clock(); for (auto e : v)
//	{
//		us.erase(e);
//	}
//	size_t end6 = clock();
//	cout << "unordered_set erase:" << end6 - begin6 << endl << endl;
//	return 0;
//}
//
//int main()
//{
//	//Test_unset();
//	//Test_unmap();
//	test_set2();
//	return 0;
//}

#include"HashTable.h"
void TestHT1()
{
	HashTable<int, int> ht;
	int a[] = { 19,30,5,36,13,20,21,12,58 };
	for (auto e : a)
	{
		ht.insert({ e, e });
	}

	cout << ht.Find(5) << endl;
	cout << ht.Find(58) << endl;

	ht.Erase(5);
	cout << ht.Find(5) << endl;
	cout << ht.Find(58) << endl;

	for (size_t i = 100; i < 200; i++)
	{
		ht.insert({ i, i });
	}
}

void TestHT2()
{
	//HashTable<string, string, StringHashFunc> dict;
	HashTable<string, string> dict;
	dict.insert({ "insert", "插入" });

	auto ptr = dict.Find("insert");
	if (ptr)
	{
		cout << ptr->_kv.second << endl;
	}

	HashFunc<string> hf;
	cout << hf("abcd") << endl;
	cout << hf("bcad") << endl;
	cout << hf("aadd") << endl;
}
int main()
{
	//TestHT1();
	TestHT2();
	return 0;
}